package com.doubao.user.service;

import com.doubao.common.result.Result;
import com.doubao.user.dto.VipInfoDTO;
import com.doubao.user.dto.request.UserInfoUpdateRequest;
import com.doubao.user.dto.request.UserPasswordUpdateRequest;
import com.doubao.user.dto.response.UserInfoResponse;
import com.doubao.user.entity.User;

/**
 * 用户服务接口
 */
public interface UserService {

    /**
     * 根据ID获取用户信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    User getUserById(Long userId);

    /**
     * 根据用户名获取用户信息
     *
     * @param username 用户名
     * @return 用户信息
     */
    User getUserByUsername(String username);

    /**
     * 根据手机号获取用户信息
     *
     * @param phone 手机号
     * @return 用户信息
     */
    User getUserByPhone(String phone);

    /**
     * 根据邮箱获取用户信息
     *
     * @param email 邮箱
     * @return 用户信息
     */
    User getUserByEmail(String email);

    /**
     * 获取当前登录用户信息
     *
     * @return 用户信息
     */
    UserInfoResponse getCurrentUserInfo();

    /**
     * 更新用户信息
     *
     * @param request 用户信息更新请求
     * @return 更新结果
     */
    Result<Void> updateUserInfo(UserInfoUpdateRequest request);

    /**
     * 更新用户密码
     *
     * @param request 用户密码更新请求
     * @return 更新结果
     */
    Result<Void> updatePassword(UserPasswordUpdateRequest request);

    /**
     * 更新用户VIP状态
     *
     * @param userId    用户ID
     * @param vipStatus VIP状态
     * @return 更新结果
     */
    Result<Void> updateVipStatus(Long userId, Integer vipStatus);

    /**
     * 更新用户每日tokens上限
     *
     * @param userId          用户ID
     * @param dailyTokensLimit 每日tokens上限
     * @return 更新结果
     */
    Result<Void> updateDailyTokensLimit(Long userId, Integer dailyTokensLimit);

    /**
     * 增加用户token使用量
     *
     * @param userId 用户ID
     * @param tokens token数量
     * @return 增加结果
     */
    Result<Void> increaseTokensUsed(Long userId, Long tokens);

    /**
     * 更新用户最后登录信息
     *
     * @param userId 用户ID
     * @param ip     登录IP
     * @return 更新结果
     */
    Result<Void> updateLastLogin(Long userId, String ip);

    /**
     * 禁用用户
     *
     * @param userId 用户ID
     * @return 禁用结果
     */
    Result<Void> disableUser(Long userId);

    /**
     * 启用用户
     *
     * @param userId 用户ID
     * @return 启用结果
     */
    Result<Void> enableUser(Long userId);

    /**
     * 检查用户今日token是否超限
     *
     * @param userId 用户ID
     * @return 是否超限
     */
    boolean isTokenLimitExceeded(Long userId);

    /**
     * 获取用户今日可用token数量
     *
     * @param userId 用户ID
     * @return 可用token数量
     */
    int getAvailableTokens(Long userId);

    /**
     * 检查用户名是否存在
     *
     * @param username 用户名
     * @return 是否存在
     */
    boolean isUsernameExists(String username);

    /**
     * 检查手机号是否存在
     *
     * @param phone 手机号
     * @return 是否存在
     */
    boolean isPhoneExists(String phone);

    /**
     * 检查邮箱是否存在
     *
     * @param email 邮箱
     * @return 是否存在
     */
    boolean isEmailExists(String email);

    /**
     * 绑定微信账号
     *
     * @param userId 用户ID
     * @param openid 微信OpenID
     * @param unionid 微信UnionID
     * @param type 绑定类型：miniapp(小程序)、mp(公众号)、web(网站)、app(APP)
     * @return 绑定结果
     */
    boolean bindWechat(Long userId, String openid, String unionid, String type);

    /**
     * 解绑微信账号
     *
     * @param userId 用户ID
     * @param type 绑定类型：miniapp(小程序)、mp(公众号)、web(网站)、app(APP)
     * @return 解绑结果
     */
    boolean unbindWechat(Long userId, String type);

    /**
     * 检查用户是否已绑定微信
     *
     * @param userId 用户ID
     * @return 是否已绑定
     */
    boolean isWechatBound(Long userId);

    /**
     * 获取用户VIP信息
     *
     * @param userId 用户ID
     * @return VIP信息
     */
    VipInfoDTO getUserVipInfo(Long userId);
}